/*
 * De controller, volgens MVC-model. Weinig anders over te zeggen,
 * behalve dat deze klasse dus de voortgang van het spel in de gaten houdt, data uit view verwerkt en het spel start/stopt.
 */

package meesterbrein;

import javax.swing.JButton;
import java.awt.Color;

/**
 *
 * @author Laurens van Dijk, s3012557 en Gerdriaan Mulder, s3048764
 */
public class Controller {

    public static final int WWIDTH = 480, WHEIGHT = 640; //NB: Ik weet niet zeker of dit onder view of controller hoort.
    public static Controller c;
    public static View v;
    public static Maker maker;
    public static Breaker kapot;
    public static Optionmenu op;
    public static int aantalCombinaties = 0;
    public static boolean gameOver = false;
    public static boolean spelGestart = false;
    public static boolean spelVoorbij = false;
    public static boolean breakerBeurt = false;
    public static boolean lastPlayerBreaker = false;

    /**
     * mensBreker:
     * false: Menselijke speler *maakt* de code
     * true:  Menselijke speler *kraakt* de code
     */
    public static boolean mensBreker = false;
    public static boolean optiesgedaanenzo = false;

    /**
     * Veegt het bord leeg en start een nieuw spel.
     */
    static void startGame() {
        if (optiesgedaanenzo) {
            System.out.println("DEBUG: optiesgedaanenzo");
            if (mensBreker) {
                maker = new aimaker();
                breakerBeurt = true;
                lastPlayerBreaker = true;
                kapot = new humanbreaker();
            } else {
                // omgewisseld tov bovenstaand
                // ai = new aibreaker();
                // life = new humanmaker();
            }
            System.out.println("DEBUG: startgamebtn pressed.");
            v.clearBoard();
        }
    }

    /**
     * geeft de beurt aan de volgende
     */
    static void volgendeSpeler() {
        breakerBeurt = (lastPlayerBreaker) ? false : true;
        if (breakerBeurt) {
            kapot.doeStap();
            lastPlayerBreaker = true;
            volgendeSpeler();
        } else {
            maker.doeStap();
            lastPlayerBreaker = false;
            breakerBeurt = true;
        }

    }

    /**
     * Toont de oplossing, mits de AI codemaker is.
     */
    static void showSolution() {
        System.out.println("DEBUG: solution button pressed.");
        spelVoorbij = true;
        v.showSolution(maker);
    }

    /**
     * Zet een aantal pinnen als hint.
     */
    static void setPins() {
        System.out.println("DEBUG: funcbtn setPins()");
        v.zetPinnen();
    }

    /**
     * Zetpinnen, maar dan met arrays.
     * @param p - een array van pinnen.
     */
    static void setPins(Model.Pin[] p) {
        System.out.println("DEBUG: setPins(Model.Pin[] p) angeruft");
        v.zetPinnen(p);
    }

    /**
     * Geeft de laatst gekozen kleurencombinatie door aan view.
     */
    static Model.Kleur[] getLastCombination() {
        return v.getLastCombination();
    }

    /**
     * pinnen zetten of de oplossing tonen, afhankelijk van of de menselijke speler maker of breker is.
     */
    static void processFuncbtn() {
        if (!mensBreker) {
            setPins();
        } else {
            showSolution();
        }
    }

    /**
     * geeft de volgende kleur in de kleuren-enum, en verandert de kleur van de button in deze kleur.
     *
     * @param j - de JButton waar de kleur van dient te worden veranderd.
     */
    static void guessNextColour(JButton j) {
        Color huidigeKleur = j.getBackground();
        if (huidigeKleur == Color.GRAY) {
            Model.Kleur kleurtje = Model.Kleur.Rood;
            j.setBackground(kleurtje.getColor());
        } else {
            Model.Kleur volgendeKleur = Model.Kleur.fromColor(huidigeKleur).volgende();
            j.setBackground(volgendeKleur.getColor());
        }
    }

    /**
     * geeft de volgende pin uit de pin-enum en verandert bijbehorende kleur van de button
     * @param j de JButton waarop allerlei gekke dingen worden uitgevoerd
     */
    static void guessNextPin(JButton j) {
        Color huidigeKleur = j.getBackground();
        Model.Pin volgendePin = Model.Pin.fromColor(huidigeKleur).volgende();
        j.setBackground(volgendePin.getColor());
    }

    /**
     * De constructor, begint met vragen of de menselijke speler maker of breker wil zijn.
     */
    public Controller()
    {
        op = new Optionmenu();
    }

    /**
     * Creert model en view.
     */
    public static void genereerSpelBord() {
        Model m = new Model();
        v = new View(m);
        startGame();
    }

    /**
     * main-klasse, niet echt veel over te vertellen.
     * @param args argumenten
     */
    public static void main(String[] args) {
        c = new Controller();
    }

}
